<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>git知识点总结 | haijd</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  
  <meta name="keywords" content="Git学习" />
  
  
  
  
  <meta name="description" content="git知识点总结">
<meta name="keywords" content="Git学习">
<meta property="og:type" content="article">
<meta property="og:title" content="git知识点总结">
<meta property="og:url" content="http://www.hais2.com/2015/10/14/Git-points-summary/index.html">
<meta property="og:site_name" content="haijd">
<meta property="og:description" content="git知识点总结">
<meta property="og:locale" content="default">
<meta property="og:image" content="http://www.hais2.com/image/git/git1.png">
<meta property="og:updated_time" content="2017-08-02T15:22:33.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="git知识点总结">
<meta name="twitter:description" content="git知识点总结">
<meta name="twitter:image" content="http://www.hais2.com/image/git/git1.png">
  
    <link rel="alternate" href="/atom.xml" title="haijd" type="application/atom+xml">
  
  <link rel="icon" href="/css/images/favicon.ico">
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link href="https://fonts.googleapis.com/css?family=Open+Sans|Montserrat:700" rel="stylesheet" type="text/css">
  <link href="https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic" rel="stylesheet" type="text/css">
  <link href="//cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">
  <style type="text/css">
    @font-face{font-family:futura-pt;src:url(https://use.typekit.net/af/9749f0/00000000000000000001008f/27/l?subset_id=2&fvd=n5) format("woff2");font-weight:500;font-style:normal;}
    @font-face{font-family:futura-pt;src:url(https://use.typekit.net/af/90cf9f/000000000000000000010091/27/l?subset_id=2&fvd=n7) format("woff2");font-weight:500;font-style:normal;}
    @font-face{font-family:futura-pt;src:url(https://use.typekit.net/af/8a5494/000000000000000000013365/27/l?subset_id=2&fvd=n4) format("woff2");font-weight:lighter;font-style:normal;}
    @font-face{font-family:futura-pt;src:url(https://use.typekit.net/af/d337d8/000000000000000000010095/27/l?subset_id=2&fvd=i4) format("woff2");font-weight:400;font-style:italic;}</style>
    
  <link rel="stylesheet" id="athemes-headings-fonts-css" href="//fonts.googleapis.com/css?family=Yanone+Kaffeesatz%3A200%2C300%2C400%2C700&amp;ver=4.6.1" type="text/css" media="all">
  <link rel="stylesheet" href="/css/style.css">

  <script src="/js/jquery-3.1.1.min.js"></script>

  <!-- Bootstrap core CSS -->
  <link rel="stylesheet" href="/css/bootstrap.css" >
  <link rel="stylesheet" href="/css/hiero.css" >
  <link rel="stylesheet" href="/css/glyphs.css" >
  
    <link rel="stylesheet" href="/css/vdonate.css" >
  

</head>

<script>
var themeMenus = {};

  themeMenus["/"] = "Home"; 

  themeMenus["/archives"] = "Archives"; 

  themeMenus["/categories"] = "Categories"; 

  themeMenus["/tags"] = "Tags"; 

  themeMenus["/about"] = "About"; 

</script>


  <body data-spy="scroll" data-target="#toc" data-offset="50">


  <header id="allheader" class="site-header" role="banner">
  <div class="clearfix container">
      <div class="site-branding">

          <h1 class="site-title">
            
              <a href="/" title="haijd" rel="home"> haijd </a>
            
          </h1>

          
            <div class="site-description">Stay Hungry,Stay Foolish</div>
          
            
          <nav id="main-navigation" class="main-navigation" role="navigation">
            <a class="nav-open">Menu</a>
            <a class="nav-close">Close</a>
            <div class="clearfix sf-menu">

              <ul id="main-nav" class="nmenu sf-js-enabled">
                    
                      <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-1663"> <a class="" href="/">Home</a> </li>
                    
                      <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-1663"> <a class="" href="/archives">Archives</a> </li>
                    
                      <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-1663"> <a class="" href="/categories">Categories</a> </li>
                    
                      <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-1663"> <a class="" href="/tags">Tags</a> </li>
                    
                      <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-1663"> <a class="" href="/about">About</a> </li>
                    
              </ul>
            </div>
          </nav>


      </div>
  </div>
</header>




  <div id="container">
    <div id="wrap">
            
      <div id="content" class="outer">
        
          <section id="main" style="float:none;"><article id="post-Git-points-summary" style="width: 66%; float:left;" class="article article-type-post" itemscope itemprop="blogPost" >
  <div id="articleInner" class="clearfix post-1016 post type-post status-publish format-standard has-post-thumbnail hentry category-template-2 category-uncategorized tag-codex tag-edge-case tag-featured-image tag-image tag-template">
    
    
      <header class="article-header">
        
  
    <h1 class="thumb" class="article-title" itemprop="name">
      git知识点总结
    </h1>
  

      </header>
    
    <div class="article-meta">
      
	Posted on <a href="/2015/10/14/Git-points-summary/" class="article-date">
	  <time datetime="2015-10-14T12:30:45.000Z" itemprop="datePublished">October 14, 2015</time>
	</a>

      
	<span id="busuanzi_container_page_pv">
	  本文总阅读量<span id="busuanzi_value_page_pv"></span>次
	</span>

    </div>
    <div class="article-entry" itemprop="articleBody">
      
        <p><strong>对git的理解</strong>：<br>　　1、git跟踪的不是文件，而是修改，这就是git优秀而且快速的原因。<br>　　2、当你从远程克隆的时候，其实就是把git本地的master分支和远程的master分支对应起来了，远程仓库的默认名称是<em>origin</em>。<br><a id="more"></a><br><strong>暂存区</strong>：<br>　　暂存区在git中是一个比较重要的概念，如果知道EntityFarmework的延迟加载的话，那么就好理解这个，因为暂存区和EF的延迟加载原理是一样的，都是把需要真正提交的数据暂时存储在一起，然后在执行提交命令的时候一次性全部提交。<br>　　暂存区就是用来存储执行<code>git add</code>命令后添加到git库的文件，暂存区的文件暂时没有提交到git的库里面，直到执行<code>git commit</code>命令才会真正的提交<code>git add</code>命令所添加的改变。</p>
<p><strong>HEAD</strong>：<br>　　相当于c语言里面的指针，不过HEAD指向的是每一次提交的版本，比如你要回退到前一个版本，使用的是<code>git reset --dead Head^</code>，这个命令就是把HEAD指针指向了前一个版本。</p>
<p><strong>管理修改</strong>：<br>　　每一次<code>git commit</code>的时候都是提交暂存区的文件，也就是提交了执行<code>git add</code>命令后的修改。假如做了一次修改，然后执行了<code>git add</code>命令，之后又对该文件做了修改，这时直接进行<code>git commit</code>就会发现，只有第一次的修改被提交到了git库里面，这是因为第一次修改完执行了<code>git add</code>命令，也就是把改变提交到了暂存区，而第二次修改没有执行<code>git add</code>，也就是没有提交到暂存区，这时执行<code>git commit</code>命令的时候只会把暂存区存储的第一次修改提交到git库里面。</p>
<p><strong>远程git仓库</strong>：<br>　　上面所做的都是把文件修改、记录等存储在了本地的库里面，但是我们想要发挥分布式的功能、和其他人协作，或者是为了安全(硬盘挂了也不会丢失项目)，就需要将文件同步到云端，也就是保存在服务器上面，最著名的当然就是<em>github</em>了。但是鉴于国内的网络环境，比较推荐开源中国的<em>git@OSC</em>、github的寨版<em>gitcafe</em>。</p>
<p><strong>分支</strong>：<br>　　分支的概念就是一个需要合理完成的项目，每个人都各干各的活，但是又怕代码没有完成提交后影响其他人的工作，更怕的是不提交就会丢失每天的工作进度，这在使用<em>SVN</em>等代码管理软件时是很常见的问题。为了解决这个两难的问题，git中就出现了分支。<br>　　如果你需要在一个完整的模块完成后再<em>push</em>到远程git库中，这时就可以创建一个属于自己的分支，然后在这个分支里面远程提交代码，这样既不影响别人的工作，也不怕丢失每天的工作进度。到最后完成时，可以直接将整个分支合并到总的远程库里面。</p>
<p><strong>分支冲突</strong>：<br>　　如果我们在两个分支上分别修改并提交了同一个文件，那么在合并的时候就会发生冲突，使用<code>git status</code>命令可以查看冲突的文件是什么，然后打开冲突文件修改后再提交，然后可以使用<code>git log --graph</code>看到分支合并的具体情况。</p>
<p><strong>分支管理策略</strong>：<br>　　在通常情况下，使用git合并分支使用的是<em>Fast forward</em>模式，也就是快速模式，在这种模式下合并后，如果删除了分支，就会丢失分支的信息(该分支合并、提交的信息，对出错后回退操作造成困难)。<br>　　可以强制禁用<em>Fast forward</em>模式，使用普通模式，这样git就会把合并当作一次普通的提交，也会留下<strong>commit id</strong>等信息，如果合并后需要回退版本就非常方便了。<br>　　<code>git merge --no--ff -m &quot;info&quot; [branch name]</code>  <code>--no--ff</code>参数表示禁用<em>Fast forward</em>模式，把这次合并当作一次<em>commit</em>，所以使用<code>-m</code>参数填写了提交信息。</p>
<p>　　在实际开发中锋分支策略：<br>　　首先<em>master</em>分支应该是最稳定的，也就是每一个version发布的时候，才把其他的分支合并到<em>master</em>中。<br>　　<img src="/image/git/git1.png" alt=""><br>　　团队的成员可以在一个“次分支”<em>dev</em>上面提交，然后每个人都有自己的分支，在版本发布的时候，再把<em>dev</em>合并到<em>master</em>上。</p>
<p><strong>bug分支</strong>：<br>　　使用场景：你的分支正在开发中，但是昨天提交的代码中有一个bug影响到了其他人的工作，你需要先停下手头的分支开发，去修复这个bug，然后再回来继续开发。有一个主要的问题就是，你当前手头的工作还没有完成不想提交，但是如果修改这个bug后提交的话，会连同所有的修改都提交上去。<br>　　git中的<code>git stash</code>命令可以将不需要提交的内容暂时隐藏起来，在提交的时候不会提交隐藏的内容。<br>　　首先执行<code>git stash</code>命令，将当前的工作区内容隐藏起来，然后确定需要修改的bug在哪个分支上面，就在哪个上面临时创建一个Bug分支。 假如在master分支上面，就先<code>git chechout master</code>回到master分支，然后<code>git checkout -b [bug branch name]</code>创建一个临时分支，修改Bug后提交到该临时分支，然后回到master分支合并删除该临时分支。这样就完成了临时修改bug的任务。<br>　　最后我们需要回到刚才手头的工作：可以使用<code>git stutes</code>命令查看，发现当前的工作区是干净的，因为bug已经修复提交，刚才的工作隐藏不见了，需要把刚才隐藏的内容找回来。<br>　　使用<code>git stash list</code>命令可以查看当前隐藏的工作区内容，需要恢复可以使用<code>git stash apply</code>命令，删除隐藏区内容使用<code>git stash drop</code>命令。也可以同时恢复并删除隐藏区，使用<code>git stash pop</code>命令，可以恢复的同时删除隐藏内容。<br>　　可以多次stash，这些stash的记录都在<em>stash list</em>中存储，可以恢复指定的stash，使用<code>git stash apply stash@{0}</code>命令，<code>stash@{0}</code>是执行<code>git stash list</code>命令显示的行首的参数。</p>
<p><strong>feature分支</strong>：<br>　　每次添加一个新的功能最好就是添加一个新的分支，因为实验性质的代码，避免对主分支造成干扰。<br>　　如果要将一个没有合并的分支进行删除，需要进行强制删除，使用命令<code>git branch -D [branch name]</code>。</p>
<p><strong>多人协作</strong>：<br>　　<em>push</em>命令就是将本地分支和远程库分支对应起来，不一定要什么内容都<em>push</em>上去，比如在你自己的分支上修改了一个bug，只需要合并到本地的分支里面，然后一同<em>push</em>，除非你需要把每个bug的信息提交到远程库。</p>
<p><strong>标签管理</strong>：<br>　　发布一个版本时，我们通常先在版本库中打一个标签，这样就确定了当时打标签时的版本，如果有需要就能从这个标签获得完整的历史版本，所以标签相当于一个版本库的快照。git的标签其实指向的还是一个commit的指针(这和分支很像，但是分支是可以移动的，标签不能移动)。<br>　　标签默认是打在最新一次的提交上面的。所以如果想在指定的<em>commit</em>上面打标签，可以找到当时的<em>commit id</em>，使用命令<code>git tag [tag name] [commit id]</code>，这样就可以在指定的<em>commit</em>上面打上标签，也可以使用<code>git tag -a [tag name] -m &quot;标签说明&quot;</code>命令打上带有说明信息的标签。<br>　　使用<code>git tag</code>命令列出的tag列表不是按照时间顺序的，是按照字母排序的。</p>
<p><strong>操作标签</strong>：<br>　　创建的标签都是打在本地的，所以可以安全的删除，如果需要把标签推送到远程库，推送某个标签可以使用命令<code>git push origin [tag name]</code>，推送所有的标签可以使用<code>git push origin --tags</code>。<br>　　删除标签可以使用<code>git tag -d [tag name]</code>命令，这个命令只是删除本地创建的标签，如果标签已经推送到了远程库，那么需要先删除本地标签，然后执行远程删除命令<code>git tag push origin :refs/tags/[tag name]</code>。<br>　　<br><em>以上知识点来自网络资料的学习，感谢廖雪峰老师的git教程，对我学习git帮助很大，也谢谢其他博主，分享让我们共同进步。</em></p>

      
    </div>
    <footer class="entry-meta entry-footer">
      
	<span class="ico-folder"></span>
    <a class="article-category-link" href="/categories/Git/">Git</a>

      
  <span class="ico-tags"></span>
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Git学习/">Git学习</a></li></ul>

      
        <div id="donation_div"></div>

<script src="/js/vdonate.js"></script>
<script>
var a = new Donate({
  title: '如果觉得我的文章对您有用，请随意打赏。您的支持将鼓励我继续创作!', // 可选参数，打赏标题
  btnText: 'Donate', // 可选参数，打赏按钮文字
  el: document.getElementById('donation_div'),
  wechatImage: '/css/images/wechatPay.png',
  alipayImage: '/css/images/alipay.jpg'
});
</script>
      

      
        
	<section id="comments" class="comment">
	  <div id="disqus_thread">
	  <noscript>Please enable JavaScript to view the <a href="//disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
	  </div>
	</section>

	<script type="text/javascript">
	var disqus_shortname = 'haijdblog';
	(function(){
	  var dsq = document.createElement('script');
	  dsq.type = 'text/javascript';
	  dsq.async = true;
	  dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
	  (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
	}());
	(function(){
	  var dsq = document.createElement('script');
	  dsq.type = 'text/javascript';
	  dsq.async = true;
	  dsq.src = '//' + disqus_shortname + '.disqus.com/count.js';
	  (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
	}());
	</script>


      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2016/01/01/Umbraco-Getting-Started-1/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          1、Umbraco简介和安装
        
      </div>
    </a>
  
  
    <a href="/2015/10/06/Of-the-nine-story-Monster-Tower/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">《九层妖塔》</div>
    </a>
  
</nav>

  
</article>

<!-- Table of Contents -->

  <aside id="sidebar">
    <div id="toc" class="toc-article">
    <strong class="toc-title">Contents</strong>
    
      <ol class="nav">None</ol>
    
    </div>
  </aside>
</section>
        
      </div>
      <footer id="footer" class="site-footer">
  

  <div class="clearfix container">
      <div class="site-info">
	      &copy; 2018 haijd All Rights Reserved.
          
            <span id="busuanzi_container_site_uv">
              本站访客数<span id="busuanzi_value_site_uv"></span>人次  
              本站总访问量<span id="busuanzi_value_site_pv"></span>次
            </span>
          
      </div>
      <div class="site-credit">
        Theme by <a href="https://github.com/iTimeTraveler/hexo-theme-hiero" target="_blank">hiero</a>
      </div>
  </div>
</footer>


<!-- min height -->

<script>
    var contentdiv = document.getElementById("content");

    contentdiv.style.minHeight = document.body.offsetHeight - document.getElementById("allheader").offsetHeight - document.getElementById("footer").offsetHeight + "px";
</script>
    </div>
    <!-- <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
    <a href="/categories" class="mobile-nav-link">Categories</a>
  
    <a href="/tags" class="mobile-nav-link">Tags</a>
  
    <a href="/about" class="mobile-nav-link">About</a>
  
</nav> -->
    

<!-- mathjax config similar to math.stackexchange -->

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      processEscapes: true
    }
  });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for(i=0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>

<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/scripts.js"></script>
<script src="/js/bootstrap.js"></script>
<script src="/js/main.js"></script>








	<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
	</script>






  </div>

  <a id="rocket" href="#top" class=""></a>
  <script type="text/javascript" src="/js/totop.js" async=""></script>
</body>
</html>
